export {}
class Person {
  /*先做类型声明*/
  name: string //默认是public
  age: number
  private lange: string //私有属性。不能被外部访问；只能通过calss类本声访问(Person.lange)。
  protected gender: boolean = true //被保护的成员，也不能被外部访问。但protected成员在派生类中仍然可以访问。
  constructor(name: string, age: number) {
    this.name = name
    this.age = age
    this.lange = 'english'
  }
  sayHi(msg: string): void {
    console.log('i am', this.name)
    console.log('age', this.age)
    console.log('age', this.gender)
  }
}

class Student extends Person {
  private constructor(name: string, age: number) {
    super(name, age)
    console.log(this.gender)
  }
  static create(name: string, age: number) {
    return new Student(name, age)
  }
}

const tom = new Person('tom', 18)
console.log(tom.name)
console.log(tom.age)

// console.log(tom.lange)//实例不能访问class私有成员
// console.log(tom.gender)//实例不能访问class被保护的成员

// const jack = new Student('jack',18)//这个被申明构造器是私有的，所以也不能被实例化了。protected也是一样。

const Jack = Student.create('jack', 28)

/*readonly只读属性*/
class Teacher {
  name: string //默认是public
  readonly age: number
  protected readonly gender: boolean = true //被保护的成员，也不能被外部访问。但protected成员在派生类中仍然可以访问。
  constructor(name: string, age: number) {
    this.name = name
    this.age = age
  }
}

const jsen = new Teacher('jsen',28)
console.log(jsen.name)
// jsen.name=20 //不被允许修改
